/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2011 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.3
*/
(function (a) {
    var b = (a.browser.msie ? "paste" : "input") + ".mask", c = window.orientation != undefined;
    a.mask = {definitions: {9: "[0-9]", a: "[A-Za-z]", "*": "[A-Za-z0-9]"}, dataName: "rawMaskFn"}, a.fn.extend({
        caret: function (a, b) {
            if (this.length != 0) {
                if (typeof a == "number") {
                    b = typeof b == "number" ? b : a;
                    return this.each(function () {
                        if (this.setSelectionRange) this.setSelectionRange(a, b); else if (this.createTextRange) {
                            var c = this.createTextRange();
                            c.collapse(!0), c.moveEnd("character", b), c.moveStart("character", a), c.select()
                        }
                    })
                }
                if (this[0].setSelectionRange) a = this[0].selectionStart, b = this[0].selectionEnd; else if (document.selection && document.selection.createRange) {
                    var c = document.selection.createRange();
                    a = 0 - c.duplicate().moveStart("character", -1e5), b = a + c.text.length
                }
                return {begin: a, end: b}
            }
        }, unmask: function () {
            return this.trigger("unmask")
        }, mask: function (d, e) {
            if (!d && this.length > 0) {
                var f = a(this[0]);
                return f.data(a.mask.dataName)()
            }
            e = a.extend({placeholder: "_", completed: null}, e);
            var g = a.mask.definitions, h = [], i = d.length, j = null, k = d.length;
            a.each(d.split(""), function (a, b) {
                b == "?" ? (k--, i = a) : g[b] ? (h.push(new RegExp(g[b])), j == null && (j = h.length - 1)) : h.push(null)
            });
            return this.trigger("unmask").each(function () {
                function v(a) {
                    var b = f.val(), c = -1;
                    for (var d = 0, g = 0; d < k; d++) if (h[d]) {
                        l[d] = e.placeholder;
                        while (g++ < b.length) {
                            var m = b.charAt(g - 1);
                            if (h[d].test(m)) {
                                l[d] = m, c = d;
                                break
                            }
                        }
                        if (g > b.length) break
                    } else l[d] == b.charAt(g) && d != i && (g++, c = d);
                    if (!a && c + 1 < i) f.val(""), t(0, k); else if (a || c + 1 >= i) u(), a || f.val(f.val().substring(0, c + 1));
                    return i ? d : j
                }

                function u() {
                    return f.val(l.join("")).val()
                }

                function t(a, b) {
                    for (var c = a; c < b && c < k; c++) h[c] && (l[c] = e.placeholder)
                }

                function s(a) {
                    var b = a.which, c = f.caret();
                    if (a.ctrlKey || a.altKey || a.metaKey || b < 32) return !0;
                    if (b) {
                        c.end - c.begin != 0 && (t(c.begin, c.end), p(c.begin, c.end - 1));
                        var d = n(c.begin - 1);
                        if (d < k) {
                            var g = String.fromCharCode(b);
                            if (h[d].test(g)) {
                                q(d), l[d] = g, u();
                                var i = n(d);
                                f.caret(i), e.completed && i >= k && e.completed.call(f)
                            }
                        }
                        return !1
                    }
                }

                function r(a) {
                    var b = a.which;
                    if (b == 8 || b == 46 || c && b == 127) {
                        var d = f.caret(), e = d.begin, g = d.end;
                        g - e == 0 && (e = b != 46 ? o(e) : g = n(e - 1), g = b == 46 ? n(g) : g), t(e, g), p(e, g - 1);
                        return !1
                    }
                    if (b == 27) {
                        f.val(m), f.caret(0, v());
                        return !1
                    }
                }

                function q(a) {
                    for (var b = a, c = e.placeholder; b < k; b++) if (h[b]) {
                        var d = n(b), f = l[b];
                        l[b] = c;
                        if (d < k && h[d].test(f)) c = f; else break
                    }
                }

                function p(a, b) {
                    if (!(a < 0)) {
                        for (var c = a, d = n(b); c < k; c++) if (h[c]) {
                            if (d < k && h[c].test(l[d])) l[c] = l[d], l[d] = e.placeholder; else break;
                            d = n(d)
                        }
                        u(), f.caret(Math.max(j, a))
                    }
                }

                function o(a) {
                    while (--a >= 0 && !h[a]) ;
                    return a
                }

                function n(a) {
                    while (++a <= k && !h[a]) ;
                    return a
                }

                var f = a(this), l = a.map(d.split(""), function (a, b) {
                    if (a != "?") return g[a] ? e.placeholder : a
                }), m = f.val();
                f.data(a.mask.dataName, function () {
                    return a.map(l, function (a, b) {
                        return h[b] && a != e.placeholder ? a : null
                    }).join("")
                }), f.attr("readonly") || f.one("unmask", function () {
                    f.unbind(".mask").removeData(a.mask.dataName)
                }).bind("focus.mask", function () {
                    m = f.val();
                    var b = v();
                    u();
                    var c = function () {
                        b == d.length ? f.caret(0, b) : f.caret(b)
                    };
                    (a.browser.msie ? c : function () {
                        setTimeout(c, 0)
                    })()
                }).bind("blur.mask", function () {
                    v(), f.val() != m && f.change()
                }).bind("keydown.mask", r).bind("keypress.mask", s).bind(b, function () {
                    setTimeout(function () {
                        f.caret(v(!0))
                    }, 0)
                }), v()
            })
        }
    })
})(jQuery)